<?php

require_once(BaseConfig::LoadClass('usuario.class.php'      ));
require_once(BaseConfig::LoadClass('configuracion.class.php'));
require_once(BaseConfig::LoadClass('vars.class.php'         ));

class Sesion {
  var $intIniciada;
  /**
   * @var Usuario
   */
  var $oUsuario;

  function Sesion() {
    $this->oUsuario = new Usuario();
    if(isset($_SESSION['logged'])) {
      $this->intIniciada = 1;
      $this->oUsuario->SeleccionarPorIndice($_SESSION['logged']);
      $this->oUsuario->ObtenerObjetos();
    } else {
      $this->intIniciada = 0;
    }

    // Verificar si existen excepciones para quitar por el tiempo
    if(isset($_SESSION["Excepciones"]) && is_array($_SESSION["Excepciones"])) {
      foreach($_SESSION["Excepciones"] as $strNombreExcepcion => $dteLimite) {
        if($dteLimite == '0000-00-00 00:00:00') {
          continue;
        }

        if(strtotime(date("Y-m-d H:i:s")) > strtotime($dteLimite)) {
          unset($_SESSION["Excepciones"][$strNombreExcepcion]);
        }
      }
    }
    // Verificar si existen excepciones para quitar por el tiempo
    if(isset($_SESSION["Temporales"]) && is_array($_SESSION["Temporales"])) {
      $this->EliminarTemporales();
    }
  }

  /**
   * Función que regresa una variable temporal de sesion si existe actualmente
   * 
   * @param string $strNombre Nombre que identifica a la variable en sesion
   * @return variable Variable guardada en sesion
   */
  function ObtenerTemporal($strNombre) {
    if(
      isset($_SESSION["Temporales"]) && 
      is_array($_SESSION["Temporales"]) && 
      isset($_SESSION["Temporales"][$strNombre]) &&
      is_array($_SESSION["Temporales"][$strNombre]) &&
      isset($_SESSION["Temporales"][$strNombre]["Datos"])
      ) {
      return $_SESSION["Temporales"][$strNombre]["Datos"];
    } else {
      return "";
    }
  }
  
  /**
   * Función que guarda una variable en sesion por un tiempo limitado.
   * 
   * @param variable $varVariable     Variable que se guardara
   * @param string   $strNombre       Identificador de la variable (Para ser recuperada posteriormente)
   * @param int      $intSegundosVida Cantidad de segundos que se mantendrá la variable con vida
   */
  function AgregarVariableTemporal($varVariable, $strNombre, $intSegundosVida) {
    if(!isset($_SESSION["Temporales"])) {
      $_SESSION["Temporales"] = array();
    }
    
    $_SESSION["Temporales"][$strNombre] = array();
    $_SESSION["Temporales"][$strNombre]["Muere"] = date("Y-m-d H:i:s", mktime(date("H"), date("i"), date("s") + $intSegundosVida, date("m"), date("d"), date("Y")));
    $_SESSION["Temporales"][$strNombre]["Datos"] = $varVariable;
    
  }
  
  /**
   * Función que elimina las variables temporales que ya no deben tener vida
   */
  function EliminarTemporales() {
    $unxTiempoActual = strtotime(date("Y-m-d H:i:s"));
    if(!isset($_SESSION["Temporales"])) return;
    foreach($_SESSION["Temporales"] as $strNombre => $arrDatosTmp) {
      $unxTiempoLimite = strtotime($arrDatosTmp["Muere"]);
      if($unxTiempoLimite < $unxTiempoActual) {
        unset($_SESSION["Temporales"][$strNombre]);
      }
    }
  }
  
  /**
   * Función que checa si un usuario y un password se pueden loguear. De ser así
   * los guarda en sesión. Si el usuario no se puede loguear (por tratarse de
   * una IP restringida, por ejemplo), el sistema terminará de repente (die)
   *
   * @param String $strUsuario Loguin de usuario a checar
   * @param String $strPass    Password del usuario que se checará
   * @return int numero menor que 1 si hubo un error, o el ID del usuario que se logueó. (El 0 indica que no existe, numero negativos indican que no se puede loguear por estar deshabilitado
   */
  function Login($strUsuario, $strPass) {
    $oConfig = new Config();
    
    $intIdUsuario = $this->oUsuario->ChecarLogin($strUsuario, $strPass);
//    $intIdUsuario = 1;
    if((!$intIdUsuario) || ($intIdUsuario < 0)) {
      return $intIdUsuario;
//      return false;
    }
    
    $this->oUsuario->SeleccionarPorIndice($intIdUsuario);
    
    $strIpARevizar = Variables::IpNormal($_SERVER['REMOTE_ADDR']);
    
    $bolConexionNegada = false;
    $arrIpsNegadas = $this->oUsuario->ArrayIpsNegadas();
    foreach($arrIpsNegadas as $strIpRevizada) {
      if($strIpARevizar == $strIpRevizada) {
        $bolConexionNegada = true;
        break;
      }
    }
    
    $arrIpsNegadas = $oConfig->GetArray('log_ips_negadas');
    foreach($arrIpsNegadas as $strIpRevizada) {
      if($strIpARevizar == $strIpRevizada) {
        $bolConexionNegada = true;
        break;
      }
    }
    
    if($bolConexionNegada) {
      // No se encuentra ni en los globales ni en los especificos
      header('Location: index.php');
      die;
//      die('No se puede accesar al sistema');
    }
    

    if($oConfig->Get('log_especifico', '0') == '1') {
      if($this->oUsuario->strTipo != 'Admin') {
        $arrIpsValidas = $oConfig->GetArray('log_ips_especificas');
        $bolConexionCorrecta = false;
        foreach($arrIpsValidas as $strIpRevizada) {
          if($strIpARevizar == $strIpRevizada) {
            $bolConexionCorrecta = true;
            break;
          }
        }
        
        if(!$bolConexionCorrecta) {
          // No se encuentra en las globales. Probar con las locales
          $arrIpsValidas = $this->oUsuario->ArrayIpsPosibles();
          foreach($arrIpsValidas as $strIpRevizada) {
            if($strIpARevizar == $strIpRevizada) {
              $bolConexionCorrecta = true;
              break;
            }
          }
          if(!$bolConexionCorrecta) {
            // No se encuentra ni en los globales ni en los especificos
            Log::AgregarLog(-1, 'Sistema', 'Fracaso', 'Se intent&oacute; entrar desde una IP no valida', 'IP: ' . $_SERVER['REMOTE_ADDR']);
            header('Location: index.php');
            die;
//            die('No se puede accesar al sistema');
          }
        }
      }
    }

    $this->intIniciada = 1;
    $_SESSION["logged"] = $intIdUsuario;
    return true;
  }

  /**
   * Función que desloguea a un usuario (Y lo quita de la sesion)
   */
  function Logout() {
    unset($_SESSION["logged"     ]);
    unset($_SESSION["Filtros"    ]);
    unset($_SESSION["Excepciones"]);
    unset($_SESSION["Temporales" ]);
    $this->intIniciada = 0;
    $this->oUsuario = new Usuario();
  }

  function PutException($strNombreExcepcion, $dteLimite = '0000-00-00 00:00:00') {
    if(!isset($_SESSION["Excepciones"])) {
      $_SESSION["Excepciones"] = array();
    }

    $_SESSION["Excepciones"][$strNombreExcepcion] = $dteLimite;
  }

  function ExceptionExist($strNombreExcepcion) {
    if(isset($_SESSION["Excepciones"])) {
      if(isset($_SESSION["Excepciones"][$strNombreExcepcion])) {
        return $_SESSION["Excepciones"][$strNombreExcepcion];
      }
    }
    return false;
  }
}

?>
